package com.combining.f_observer.impl;

import java.util.Iterator;
import java.util.ArrayList;

import com.combining.f_observer.face.Observer;
import com.combining.f_observer.face.QuackObservable;

/**
 * 我们需要在每一个类中实现注册和通知（同在第2章我们所做的一样）。但这次要用稍微不一样的做法：
 * 我们在另一个被称为Observable的类中封装注册和通知的代码，然后将它和QuackObservable组合在一起。这样，我们只需要一份代码即可，
 * QuackObservable所有的调用都委托给Observable辅助类
 * 
 * @author dell
 * 
 */
// Observable实现了所有必要的功能。我们只要把它插进一个类，就可以让该类将工作委托给Observable
// Observable必须实现QuackObservable，因为它们具有一个相同的方法，QuackObservable会将这些方法的调用转给Observable的方法
public class Observable implements QuackObservable {
	ArrayList<Observer> observers = new ArrayList<Observer>();
	QuackObservable duck;

	public Observable(QuackObservable duck) {
		this.duck = duck;
	}

	public void registerObserver(Observer observer) {
		observers.add(observer);
	}

	public void notifyObservers() {
		Iterator<Observer> iterator = observers.iterator();
		while (iterator.hasNext()) {
			Observer observer = (Observer) iterator.next();
			observer.update(duck);
		}
	}

	public Iterator<Observer> getObservers() {
		return observers.iterator();
	}
}
